df <- read.delim("data/GP_metadata.txt")

df <- df %>%
  mutate(
    lat = as.numeric(sub(",.*", "", Lat_long)),
    long = as.numeric(sub(".*,", "", Lat_long))
  ) %>%
  filter(!is.na(lat), !is.na(long))


points_sf <- st_as_sf(df, coords = c("long", "lat"), crs = 4326)

hull <- st_convex_hull(st_union(points_sf))

uk <- ne_countries(scale = "medium", returnclass = "sf") %>% 
  filter(admin == "United Kingdom")

map_plot <- ggplot() +
  geom_sf(data = uk, fill = "gray95", color = "black") +
  geom_sf(data = hull, fill = "deepskyblue4", alpha = 0.4, color = "black") +
  theme_minimal() +
  coord_sf(expand = FALSE) 

ggsave("images/map_plot.png", map_plot, width = 6, height = 8, dpi = 300)
library(ggplot2)
library(plotly)
library(dplyr)

df_ancom <- read.delim("data/ITS/Taxonomy/Taxonomic_Abundance/F03_Establishment_ancom/data/ancom.tsv")
df_data <- read.delim("data/ITS/Taxonomy/Taxonomic_Abundance/F03_Establishment_ancom/data/data.tsv")

df_data$X <- df_data$id
df_data <- df_data[, -1]
df <- left_join(df_ancom, df_data)

p <- ggplot(df, aes(x = clr, y = W, text = X)) +
  geom_point(aes(color = `Reject.null.hypothesis`)) +
  scale_color_manual(values = c("grey", "cyan3")) +
  theme_minimal() +
  labs(x = "Centered Logarithmic (clr)",
       y = "W statistic",
       title = "Volcano plot (ANCOM results)") +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank())

ggplotly(p, tooltip = "text")
library(readr)
library(dplyr)
library(tidyr)
library(leaflet)
Avis : le package ‘leaflet’ a été compilé avec la version R 4.4.3
df <- read.delim("data/16S/Beta_Diversity/bray_permanova_Year_group/data/raw_data.tsv")
df <- df[df$Group1 != "unknown" & df$Group2 != "unknown", ]



df_nat <- df %>%
  filter(Group1 == "1940-60" | Group2 == "1940-60") %>%
  mutate(
    Compared_to = ifelse(Group1 == "1940-60", Group2, Group1),
    Compared_to = factor(Compared_to, levels = c("1940-60", "1981-2000","2001-2010", "2011-2020"))
  )

plot1 <- ggplot(df_nat, aes(x = Compared_to, y = Distance, fill = Compared_to)) +
  geom_boxplot() +
  scale_fill_manual(values = c(
    "1940-60" = "#C6DBEF", 
    "1981-2000" = "#08519C", 
    "2001-2010" = "#3182BD",
    "2011-2020" = "skyblue"
  )) +
  theme_minimal() +
  labs(
    title = "Distance to group 1940-60",
    x = NULL,
    y = "Bray-Curtis Distance"
  ) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none"
  )

df_seed <- df %>%
  filter(Group1 == "1981-2000" | Group2 == "1981-2000") %>%
  mutate(
    Compared_to = ifelse(Group1 == "1981-2000", Group2, Group1),
    Compared_to = factor(Compared_to, levels = c("1981-2000", "1940-60", "2001-2010","2011-2020"))
  )

plot2 <- ggplot(df_seed, aes(x = Compared_to, y = Distance, fill = Compared_to)) +
  geom_boxplot() +
  scale_fill_manual(values = c(
    "1940-60" = "#C6DBEF", 
    "1981-2000" = "#08519C", 
    "2001-2010" = "#3182BD",
    "2011-2020" = "skyblue"
  ))+
  theme_minimal() +
  labs(
    title = "Distance to group 1981-2000",
    x = NULL,
    y = "Bray-Curtis Distance"
  ) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none"
  )


df_green <- df %>%
  filter(Group1 == "2001-2010" | Group2 == "2001-2010") %>%
  mutate(
    Compared_to = ifelse(Group1 == "2001-2010", Group2, Group1),
    Compared_to = factor(Compared_to, levels = c( "2001-2010","1940-60", "1981-2000", "2011-2020"))
  )

plot3 <- ggplot(df_green, aes(x = Compared_to, y = Distance, fill = Compared_to)) +
  geom_boxplot() +
  scale_fill_manual(values = c(
    "1940-60" = "#C6DBEF", 
    "1981-2000" = "#08519C", 
    "2001-2010" = "#3182BD",
    "2011-2020" = "skyblue"
  ))+
  theme_minimal() +
  labs(
    title = "Distance to group 2001-2010",
    x = NULL,
    y = "Bray-Curtis Distance"
  ) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none"
  )


df_g <- df %>%
  filter(Group1 == "2011-2020" | Group2 == "2011-2020") %>%
  mutate(
    Compared_to = ifelse(Group1 == "2011-2020", Group2, Group1),
    Compared_to = factor(Compared_to, levels = c( "2011-2020","1940-60", "1981-2000", "2001-2010"))
  )

plot4 <- ggplot(df_g, aes(x = Compared_to, y = Distance, fill = Compared_to)) +
  geom_boxplot() +
  scale_fill_manual(values = c(
    "1940-60" = "#C6DBEF", 
    "1981-2000" = "#08519C", 
    "2001-2010" = "#3182BD",
    "2011-2020" = "skyblue"
  ))+
  theme_minimal() +
  labs(
    title = "Distance to group 2011-2020",
    x = NULL,
    y = "Bray-Curtis Distance"
  ) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none"
  )
library(cowplot)
title <- ggdraw() + draw_label("Bray-Curtis distances by Year Group", fontface = 'bold', size = 14)

combined_plot <- plot_grid(plot1, plot2, plot3,plot4, nrow = 1, align = "hv", labels = c("A", "B", "C", "D"))

final_plot <- plot_grid(title, combined_plot, ncol = 1, rel_heights = c(0.1, 1))

ggsave("images/permanova/Bray_Curtis/16S/bray_permanova_Year_group.png", final_plot, width = 14, height = 6, dpi = 300)
df <- read.delim("data/16S/Beta_Diversity/bray_permanova_Plough/data/raw_data.tsv")

df <- df[df$Group1 != "unknown" & df$Group2 != "unknown", ]

df_nat <- df %>%
  filter(Group1 == "no" | Group2 == "no") %>%
  mutate(
    Compared_to = ifelse(Group1 == "no", Group2, Group1),
    Compared_to = factor(Compared_to, levels = c("no", "yes"))
  )

plot3 <- ggplot(df_nat, aes(x = Compared_to, y = Distance, fill = Compared_to)) +
  geom_boxplot() +
  scale_fill_manual(values = c(
    "no" = "#C6DBEF", 
    "yes" = "#08519C"
  )) +
  theme_minimal() +
  labs(
    title = "Distance to No",
    x = NULL,
    y = "Bray-Curtis Distance"
  ) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none"
  )




df_seed <- df %>%
  filter(Group1 == "yes" | Group2 == "yes") %>%
  mutate(
    Compared_to = ifelse(Group1 == "yes", Group2, Group1),
    Compared_to = factor(Compared_to, levels = c("yes", "no"))
  )

plot1 <- ggplot(df_seed, aes(x = Compared_to, y = Distance, fill = Compared_to)) +
  geom_boxplot() +
  scale_fill_manual(values = c(
    "no" = "#C6DBEF", 
    "yes" = "#08519C"
  ))+
  theme_minimal() +
  labs(
    title = "Distance to Yes",
    x = NULL,
    y = "Bray-Curtis Distance"
  ) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none"
  )



title <- ggdraw() + draw_label("Bray-Curtis distances by Plough", fontface = 'bold', size = 14)

combined_plot <- plot_grid(plot1, plot3, nrow = 1, align = "hv", labels = c("A", "B"))

final_plot <- plot_grid(title, combined_plot, ncol = 1, rel_heights = c(0.1, 1))

ggsave("images/permanova/Bray_Curtis/16S/bray_permanova_Plough.png", final_plot, width = 14, height = 6, dpi = 300)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KZGYgPC0gcmVhZC5kZWxpbSgiZGF0YS9HUF9tZXRhZGF0YS50eHQiKQ0KDQpkZiA8LSBkZiAlPiUNCiAgbXV0YXRlKA0KICAgIGxhdCA9IGFzLm51bWVyaWMoc3ViKCIsLioiLCAiIiwgTGF0X2xvbmcpKSwNCiAgICBsb25nID0gYXMubnVtZXJpYyhzdWIoIi4qLCIsICIiLCBMYXRfbG9uZykpDQogICkgJT4lDQogIGZpbHRlcighaXMubmEobGF0KSwgIWlzLm5hKGxvbmcpKQ0KDQoNCnBvaW50c19zZiA8LSBzdF9hc19zZihkZiwgY29vcmRzID0gYygibG9uZyIsICJsYXQiKSwgY3JzID0gNDMyNikNCg0KaHVsbCA8LSBzdF9jb252ZXhfaHVsbChzdF91bmlvbihwb2ludHNfc2YpKQ0KDQp1ayA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibWVkaXVtIiwgcmV0dXJuY2xhc3MgPSAic2YiKSAlPiUgDQogIGZpbHRlcihhZG1pbiA9PSAiVW5pdGVkIEtpbmdkb20iKQ0KDQptYXBfcGxvdCA8LSBnZ3Bsb3QoKSArDQogIGdlb21fc2YoZGF0YSA9IHVrLCBmaWxsID0gImdyYXk5NSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3NmKGRhdGEgPSBodWxsLCBmaWxsID0gImRlZXBza3libHVlNCIsIGFscGhhID0gMC40LCBjb2xvciA9ICJibGFjayIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgY29vcmRfc2YoZXhwYW5kID0gRkFMU0UpIA0KDQpnZ3NhdmUoImltYWdlcy9tYXBfcGxvdC5wbmciLCBtYXBfcGxvdCwgd2lkdGggPSA2LCBoZWlnaHQgPSA4LCBkcGkgPSAzMDApDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShkcGx5cikNCg0KZGZfYW5jb20gPC0gcmVhZC5kZWxpbSgiZGF0YS9JVFMvVGF4b25vbXkvVGF4b25vbWljX0FidW5kYW5jZS9GMDNfRXN0YWJsaXNobWVudF9hbmNvbS9kYXRhL2FuY29tLnRzdiIpDQpkZl9kYXRhIDwtIHJlYWQuZGVsaW0oImRhdGEvSVRTL1RheG9ub215L1RheG9ub21pY19BYnVuZGFuY2UvRjAzX0VzdGFibGlzaG1lbnRfYW5jb20vZGF0YS9kYXRhLnRzdiIpDQoNCmRmX2RhdGEkWCA8LSBkZl9kYXRhJGlkDQpkZl9kYXRhIDwtIGRmX2RhdGFbLCAtMV0NCmRmIDwtIGxlZnRfam9pbihkZl9hbmNvbSwgZGZfZGF0YSkNCg0KcCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gY2xyLCB5ID0gVywgdGV4dCA9IFgpKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYFJlamVjdC5udWxsLmh5cG90aGVzaXNgKSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JleSIsICJjeWFuMyIpKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoeCA9ICJDZW50ZXJlZCBMb2dhcml0aG1pYyAoY2xyKSIsDQogICAgICAgeSA9ICJXIHN0YXRpc3RpYyIsDQogICAgICAgdGl0bGUgPSAiVm9sY2FubyBwbG90IChBTkNPTSByZXN1bHRzKSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KZ2dwbG90bHkocCwgdG9vbHRpcCA9ICJ0ZXh0IikNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkobGVhZmxldCkNCg0KIyBDaGFyZ2VyIGxlcyBkb25uw6llcw0KZGZfbWV0YSA8LSByZWFkX3RzdigiZGF0YS9HUF9tZXRhZGF0YS50eHQiLCBjb2xfdHlwZXMgPSBjb2xzKCkpDQoNCiMgRXh0cmFpcmUgbGF0L2xvbiBkZSBsYSBjb2xvbm5lICJMYXRfbG9uZyINCmRmX21ldGEgPC0gZGZfbWV0YSAlPiUNCiAgc2VwYXJhdGUoTGF0X2xvbmcsIGludG8gPSBjKCJMYXRpdHVkZSIsICJMb25naXR1ZGUiKSwgc2VwID0gIiwgIiwgY29udmVydCA9IFRSVUUpDQoNCiMgTmUgZ2FyZGVyIHF1J3VuIHNldWwgcG9pbnQgcGFyIHNpdGUNCmRmX3NpdGVzIDwtIGRmX21ldGEgJT4lDQogIGdyb3VwX2J5KFNpdGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgTGF0aXR1ZGUgPSBmaXJzdChMYXRpdHVkZSksDQogICAgTG9uZ2l0dWRlID0gZmlyc3QoTG9uZ2l0dWRlKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KIyBDcsOpZXIgbGEgY2FydGUNCmxlYWZsZXQoZGZfc2l0ZXMpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKCJDYXJ0b0RCLlBvc2l0cm9uIikgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoDQogICAgfkxvbmdpdHVkZSwgfkxhdGl0dWRlLA0KICAgIHJhZGl1cyA9IDUsDQogICAgY29sb3IgPSAiZGFya2JsdWUiLA0KICAgIGZpbGxPcGFjaXR5ID0gMC43LA0KICAgIHN0cm9rZSA9IEZBTFNFLA0KICAgIGxhYmVsID0gflNpdGUsDQogICAgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKG5vSGlkZSA9IEZBTFNFLCBkaXJlY3Rpb24gPSAiYXV0byIpDQogICkNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KYGBge3J9DQpkZiA8LSByZWFkLmRlbGltKCJkYXRhLzE2Uy9CZXRhX0RpdmVyc2l0eS9icmF5X3Blcm1hbm92YV9ZZWFyX2dyb3VwL2RhdGEvcmF3X2RhdGEudHN2IikNCmRmIDwtIGRmW2RmJEdyb3VwMSAhPSAidW5rbm93biIgJiBkZiRHcm91cDIgIT0gInVua25vd24iLCBdDQoNCg0KDQpkZl9uYXQgPC0gZGYgJT4lDQogIGZpbHRlcihHcm91cDEgPT0gIjE5NDAtNjAiIHwgR3JvdXAyID09ICIxOTQwLTYwIikgJT4lDQogIG11dGF0ZSgNCiAgICBDb21wYXJlZF90byA9IGlmZWxzZShHcm91cDEgPT0gIjE5NDAtNjAiLCBHcm91cDIsIEdyb3VwMSksDQogICAgQ29tcGFyZWRfdG8gPSBmYWN0b3IoQ29tcGFyZWRfdG8sIGxldmVscyA9IGMoIjE5NDAtNjAiLCAiMTk4MS0yMDAwIiwiMjAwMS0yMDEwIiwgIjIwMTEtMjAyMCIpKQ0KICApDQoNCnBsb3QxIDwtIGdncGxvdChkZl9uYXQsIGFlcyh4ID0gQ29tcGFyZWRfdG8sIHkgPSBEaXN0YW5jZSwgZmlsbCA9IENvbXBhcmVkX3RvKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoDQogICAgIjE5NDAtNjAiID0gIiNDNkRCRUYiLCANCiAgICAiMTk4MS0yMDAwIiA9ICIjMDg1MTlDIiwgDQogICAgIjIwMDEtMjAxMCIgPSAiIzMxODJCRCIsDQogICAgIjIwMTEtMjAyMCIgPSAic2t5Ymx1ZSINCiAgKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RhbmNlIHRvIGdyb3VwIDE5NDAtNjAiLA0KICAgIHggPSBOVUxMLA0KICAgIHkgPSAiQnJheS1DdXJ0aXMgRGlzdGFuY2UiDQogICkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIg0KICApDQoNCmRmX3NlZWQgPC0gZGYgJT4lDQogIGZpbHRlcihHcm91cDEgPT0gIjE5ODEtMjAwMCIgfCBHcm91cDIgPT0gIjE5ODEtMjAwMCIpICU+JQ0KICBtdXRhdGUoDQogICAgQ29tcGFyZWRfdG8gPSBpZmVsc2UoR3JvdXAxID09ICIxOTgxLTIwMDAiLCBHcm91cDIsIEdyb3VwMSksDQogICAgQ29tcGFyZWRfdG8gPSBmYWN0b3IoQ29tcGFyZWRfdG8sIGxldmVscyA9IGMoIjE5ODEtMjAwMCIsICIxOTQwLTYwIiwgIjIwMDEtMjAxMCIsIjIwMTEtMjAyMCIpKQ0KICApDQoNCnBsb3QyIDwtIGdncGxvdChkZl9zZWVkLCBhZXMoeCA9IENvbXBhcmVkX3RvLCB5ID0gRGlzdGFuY2UsIGZpbGwgPSBDb21wYXJlZF90bykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKA0KICAgICIxOTQwLTYwIiA9ICIjQzZEQkVGIiwgDQogICAgIjE5ODEtMjAwMCIgPSAiIzA4NTE5QyIsIA0KICAgICIyMDAxLTIwMTAiID0gIiMzMTgyQkQiLA0KICAgICIyMDExLTIwMjAiID0gInNreWJsdWUiDQogICkpKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RhbmNlIHRvIGdyb3VwIDE5ODEtMjAwMCIsDQogICAgeCA9IE5VTEwsDQogICAgeSA9ICJCcmF5LUN1cnRpcyBEaXN0YW5jZSINCiAgKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiDQogICkNCg0KDQpkZl9ncmVlbiA8LSBkZiAlPiUNCiAgZmlsdGVyKEdyb3VwMSA9PSAiMjAwMS0yMDEwIiB8IEdyb3VwMiA9PSAiMjAwMS0yMDEwIikgJT4lDQogIG11dGF0ZSgNCiAgICBDb21wYXJlZF90byA9IGlmZWxzZShHcm91cDEgPT0gIjIwMDEtMjAxMCIsIEdyb3VwMiwgR3JvdXAxKSwNCiAgICBDb21wYXJlZF90byA9IGZhY3RvcihDb21wYXJlZF90bywgbGV2ZWxzID0gYyggIjIwMDEtMjAxMCIsIjE5NDAtNjAiLCAiMTk4MS0yMDAwIiwgIjIwMTEtMjAyMCIpKQ0KICApDQoNCnBsb3QzIDwtIGdncGxvdChkZl9ncmVlbiwgYWVzKHggPSBDb21wYXJlZF90bywgeSA9IERpc3RhbmNlLCBmaWxsID0gQ29tcGFyZWRfdG8pKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygNCiAgICAiMTk0MC02MCIgPSAiI0M2REJFRiIsIA0KICAgICIxOTgxLTIwMDAiID0gIiMwODUxOUMiLCANCiAgICAiMjAwMS0yMDEwIiA9ICIjMzE4MkJEIiwNCiAgICAiMjAxMS0yMDIwIiA9ICJza3libHVlIg0KICApKSsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0YW5jZSB0byBncm91cCAyMDAxLTIwMTAiLA0KICAgIHggPSBOVUxMLA0KICAgIHkgPSAiQnJheS1DdXJ0aXMgRGlzdGFuY2UiDQogICkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIg0KICApDQoNCg0KZGZfZyA8LSBkZiAlPiUNCiAgZmlsdGVyKEdyb3VwMSA9PSAiMjAxMS0yMDIwIiB8IEdyb3VwMiA9PSAiMjAxMS0yMDIwIikgJT4lDQogIG11dGF0ZSgNCiAgICBDb21wYXJlZF90byA9IGlmZWxzZShHcm91cDEgPT0gIjIwMTEtMjAyMCIsIEdyb3VwMiwgR3JvdXAxKSwNCiAgICBDb21wYXJlZF90byA9IGZhY3RvcihDb21wYXJlZF90bywgbGV2ZWxzID0gYyggIjIwMTEtMjAyMCIsIjE5NDAtNjAiLCAiMTk4MS0yMDAwIiwgIjIwMDEtMjAxMCIpKQ0KICApDQoNCnBsb3Q0IDwtIGdncGxvdChkZl9nLCBhZXMoeCA9IENvbXBhcmVkX3RvLCB5ID0gRGlzdGFuY2UsIGZpbGwgPSBDb21wYXJlZF90bykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKA0KICAgICIxOTQwLTYwIiA9ICIjQzZEQkVGIiwgDQogICAgIjE5ODEtMjAwMCIgPSAiIzA4NTE5QyIsIA0KICAgICIyMDAxLTIwMTAiID0gIiMzMTgyQkQiLA0KICAgICIyMDExLTIwMjAiID0gInNreWJsdWUiDQogICkpKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RhbmNlIHRvIGdyb3VwIDIwMTEtMjAyMCIsDQogICAgeCA9IE5VTEwsDQogICAgeSA9ICJCcmF5LUN1cnRpcyBEaXN0YW5jZSINCiAgKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiDQogICkNCg0KDQoNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoY293cGxvdCkNCnRpdGxlIDwtIGdnZHJhdygpICsgZHJhd19sYWJlbCgiQnJheS1DdXJ0aXMgZGlzdGFuY2VzIGJ5IFllYXIgR3JvdXAiLCBmb250ZmFjZSA9ICdib2xkJywgc2l6ZSA9IDE0KQ0KDQpjb21iaW5lZF9wbG90IDwtIHBsb3RfZ3JpZChwbG90MSwgcGxvdDIsIHBsb3QzLHBsb3Q0LCBucm93ID0gMSwgYWxpZ24gPSAiaHYiLCBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIsICJEIikpDQoNCmZpbmFsX3Bsb3QgPC0gcGxvdF9ncmlkKHRpdGxlLCBjb21iaW5lZF9wbG90LCBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMSwgMSkpDQoNCmdnc2F2ZSgiaW1hZ2VzL3Blcm1hbm92YS9CcmF5X0N1cnRpcy8xNlMvYnJheV9wZXJtYW5vdmFfWWVhcl9ncm91cC5wbmciLCBmaW5hbF9wbG90LCB3aWR0aCA9IDE0LCBoZWlnaHQgPSA2LCBkcGkgPSAzMDApDQpgYGANCg0KDQoNCmBgYHtyfQ0KZGYgPC0gcmVhZC5kZWxpbSgiZGF0YS8xNlMvQmV0YV9EaXZlcnNpdHkvYnJheV9wZXJtYW5vdmFfcEhfZ3JvdXAvZGF0YS9yYXdfZGF0YS50c3YiKQ0KDQpkZiA8LSBkZltkZiRHcm91cDEgIT0gInVua25vd24iICYgZGYkR3JvdXAyICE9ICJ1bmtub3duIiwgXQ0KDQpkZl9uYXQgPC0gZGYgJT4lDQogIGZpbHRlcihHcm91cDEgPT0gIm5vIiB8IEdyb3VwMiA9PSAibm8iKSAlPiUNCiAgbXV0YXRlKA0KICAgIENvbXBhcmVkX3RvID0gaWZlbHNlKEdyb3VwMSA9PSAibm8iLCBHcm91cDIsIEdyb3VwMSksDQogICAgQ29tcGFyZWRfdG8gPSBmYWN0b3IoQ29tcGFyZWRfdG8sIGxldmVscyA9IGMoIm5vIiwgInllcyIpKQ0KICApDQoNCnBsb3QzIDwtIGdncGxvdChkZl9uYXQsIGFlcyh4ID0gQ29tcGFyZWRfdG8sIHkgPSBEaXN0YW5jZSwgZmlsbCA9IENvbXBhcmVkX3RvKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoDQogICAgIm5vIiA9ICIjQzZEQkVGIiwgDQogICAgInllcyIgPSAiIzA4NTE5QyINCiAgKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RhbmNlIHRvIE5vIiwNCiAgICB4ID0gTlVMTCwNCiAgICB5ID0gIkJyYXktQ3VydGlzIERpc3RhbmNlIg0KICApICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSINCiAgKQ0KDQoNCg0KDQpkZl9zZWVkIDwtIGRmICU+JQ0KICBmaWx0ZXIoR3JvdXAxID09ICJ5ZXMiIHwgR3JvdXAyID09ICJ5ZXMiKSAlPiUNCiAgbXV0YXRlKA0KICAgIENvbXBhcmVkX3RvID0gaWZlbHNlKEdyb3VwMSA9PSAieWVzIiwgR3JvdXAyLCBHcm91cDEpLA0KICAgIENvbXBhcmVkX3RvID0gZmFjdG9yKENvbXBhcmVkX3RvLCBsZXZlbHMgPSBjKCJ5ZXMiLCAibm8iKSkNCiAgKQ0KDQpwbG90MSA8LSBnZ3Bsb3QoZGZfc2VlZCwgYWVzKHggPSBDb21wYXJlZF90bywgeSA9IERpc3RhbmNlLCBmaWxsID0gQ29tcGFyZWRfdG8pKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygNCiAgICAibm8iID0gIiNDNkRCRUYiLCANCiAgICAieWVzIiA9ICIjMDg1MTlDIg0KICApKSsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0YW5jZSB0byBZZXMiLA0KICAgIHggPSBOVUxMLA0KICAgIHkgPSAiQnJheS1DdXJ0aXMgRGlzdGFuY2UiDQogICkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIg0KICApDQoNCg0KDQp0aXRsZSA8LSBnZ2RyYXcoKSArIGRyYXdfbGFiZWwoIkJyYXktQ3VydGlzIGRpc3RhbmNlcyBieSBQbG91Z2giLCBmb250ZmFjZSA9ICdib2xkJywgc2l6ZSA9IDE0KQ0KDQpjb21iaW5lZF9wbG90IDwtIHBsb3RfZ3JpZChwbG90MSwgcGxvdDMsIG5yb3cgPSAxLCBhbGlnbiA9ICJodiIsIGxhYmVscyA9IGMoIkEiLCAiQiIpKQ0KDQpmaW5hbF9wbG90IDwtIHBsb3RfZ3JpZCh0aXRsZSwgY29tYmluZWRfcGxvdCwgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEsIDEpKQ0KDQpnZ3NhdmUoImltYWdlcy9wZXJtYW5vdmEvQnJheV9DdXJ0aXMvMTZTL2JyYXlfcGVybWFub3ZhX1Bsb3VnaC5wbmciLCBmaW5hbF9wbG90LCB3aWR0aCA9IDE0LCBoZWlnaHQgPSA2LCBkcGkgPSAzMDApDQpgYGANCg0KDQoNCg0KYGBge3IgYmFycGxvdC0xNlMsIGVjaG8gPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY3VzdG9tX2JsdWVzIDwtIGMoDQogICIjMDgzMDZCIiwgIA0KICAiIzA4NTE5QyIsICANCiAgIiMzMTgyQkQiLCAgDQogICIjNkJBRUQ2IiwgIA0KICAiI0M2REJFRiINCikNCg0KdGF4YV9kZiA8LSByZWFkX2NzdigiZGF0YS8xNlMvVGF4b25vbXkvczEwX3RheGFfYmFycGxvdF9ieV9zaXRlL2RhdGEvbGV2ZWwtMi5jc3YiKQ0KDQptZXRhX2NvbHMgPC0gYygiU2l0ZSIsICJBZ2UiLCAiT1NfbG9jYXRpb24iLCAicEgiLCAiWWVhcl9lc3QiLCAiTGF0X2xvbmciLCAiQ3V0dGluZyIsIkNhdHRsZSIsIlNoZWVwIiwgIlBsb3VnaCIsICJFQyIsICJFc3RhYmxpc2htZW50IikNCg0KY29sbmFtZXModGF4YV9kZilbMV0gPC0gIlNpdGUiDQoNCnRheGFfbG9uZyA8LSB0YXhhX2RmICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IC1hbGxfb2YobWV0YV9jb2xzKSwNCiAgICBuYW1lc190byA9ICJUYXhvbiIsDQogICAgdmFsdWVzX3RvID0gIkFidW5kYW5jZSINCiAgKQ0KDQp0YXhhX3JlbCA8LSB0YXhhX2xvbmcgJT4lDQogIGdyb3VwX2J5KFNpdGUpICU+JQ0KICBtdXRhdGUoQWJ1bmRhbmNlID0gQWJ1bmRhbmNlIC8gc3VtKEFidW5kYW5jZSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQpzaXRlX2dyb3VwcyA8LSB0YXhhX3JlbCAlPiUNCiAgZGlzdGluY3QoU2l0ZSwgRXN0YWJsaXNobWVudCkgJT4lDQogIGFycmFuZ2UoRXN0YWJsaXNobWVudCwgU2l0ZSkNCg0Kc2l0ZV9vcmRlciA8LSBzaXRlX2dyb3VwcyAlPiUNCiAgcHVsbChTaXRlKQ0KDQp0YXhhX3JlbCA8LSB0YXhhX3JlbCAlPiUNCiAgbXV0YXRlKFNpdGUgPSBmYWN0b3IoU2l0ZSwgbGV2ZWxzID0gc2l0ZV9vcmRlcikpDQoNCg0KDQp0YXhvbl9vcmRlciA8LSB0YXhhX3JlbCAlPiUNCiAgZ3JvdXBfYnkoVGF4b24pICU+JQ0KICBzdW1tYXJpc2UoVG90YWwgPSBzdW0oQWJ1bmRhbmNlKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGFycmFuZ2UoZGVzYyhUb3RhbCkpICU+JQ0KICBwdWxsKFRheG9uKQ0KDQoNCg0KZ3JvdXBfYnJlYWtzIDwtIHNpdGVfZ3JvdXBzICU+JQ0KICBncm91cF9ieShFc3RhYmxpc2htZW50KSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBtdXRhdGUocG9zaXRpb24gPSBjdW1zdW0obikgKyAwLjUpICU+JQ0KICBmaWx0ZXIocm93X251bWJlcigpIDwgbigpKQ0KDQpzaXRlX2dyb3VwcyA8LSBzaXRlX2dyb3VwcyAlPiUNCiAgbXV0YXRlKFNpdGUgPSBmYWN0b3IoU2l0ZSwgbGV2ZWxzID0gdW5pcXVlKHNpdGVfb3JkZXIpKSkNCg0KZ3JvdXBfbGFiZWxzIDwtIHNpdGVfZ3JvdXBzICU+JQ0KICBncm91cF9ieShFc3RhYmxpc2htZW50KSAlPiUNCiAgc3VtbWFyaXNlKHBvc2l0aW9uID0gbWVkaWFuKGFzLm51bWVyaWMoU2l0ZSkpLCAuZ3JvdXBzID0gImRyb3AiKQ0KDQoNCnRheGFfcmVsIDwtIHRheGFfcmVsICU+JQ0KICBtdXRhdGUoVGF4b24gPSBmYWN0b3IoVGF4b24sIGxldmVscyA9IHRheG9uX29yZGVyKSkNCg0KDQpwbG90IDwtIGdncGxvdCh0YXhhX3JlbCwgYWVzKHggPSBTaXRlLCB5ID0gQWJ1bmRhbmNlICogMTAwLCBmaWxsID0gVGF4b24pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHJlcChjdXN0b21fYmx1ZXMsIGxlbmd0aC5vdXQgPSBuX2Rpc3RpbmN0KHRheGFfcmVsJFRheG9uKSkpICsNCiAgZ2VvbV92bGluZShkYXRhID0gZ3JvdXBfYnJlYWtzLCBhZXMoeGludGVyY2VwdCA9IHBvc2l0aW9uKSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3VyID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoZGF0YSA9IGdyb3VwX2xhYmVscywgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDEwNSwgbGFiZWwgPSBFc3RhYmxpc2htZW50KSwNCiAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIHNpemUgPSAzLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBsYWJzKA0KICAgIHggPSAiU2l0ZSIsIA0KICAgIHkgPSAiUmVsYXRpdmUgQWJ1bmRhbmNlICglKSIsIA0KICAgIGZpbGwgPSAiVGF4b24iLCANCiAgICB0aXRsZSA9ICJSZWxhdGl2ZSBhYnVuZGFuY2Ugb2YgdGF4YSBhY3Jvc3Mgc2l0ZXMgYXQgcGh5bHVtIGxldmVsICgxNlMpLCBvcmRlcmVkIGJ5IEVzdGFibGlzaG1lbnQiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHNpemUgPSA1KSwNCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpDQogICkNCg0KZ2dwbG90bHkocGxvdCkgICU+JSBsYXlvdXQod2lkdGggPSA5MDAsIGhlaWdodCA9IDUwMCkNCg0KDQoNCmBgYA0KDQoNCg0KYGBge3J9DQoNCg0KDQpgYGANCg0K